/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IAdresse;
import fr.generali.accueilclient.client.om.IClientProfessionnel;
import fr.generali.accueilclient.client.om.IContact;
import fr.generali.accueilclient.client.om.IEmail;
import fr.generali.accueilclient.client.om.ISiteInternet;
import fr.generali.accueilclient.client.om.ITelephone;
import fr.generali.accueilclient.utils.constantes.MotifModificationAdresseEnum;
import fr.generali.refservcommuns.clients.prima.Quantity;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoDossierMajDossierContact;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajAdresse;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajCourriel;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajPageWeb;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajTelephone;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoMajBienImmobilier;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoMajInformationMarketingImmobilier;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoMajModeExploitationFondCommerce;
import fr.generali.refservcommuns.rce.gestioncontact.dtogestioncontact.DtoDossierP14;
import fr.generali.refservcommuns.rce.gestioncontact.dtogestioncontact.DtoListeDossierP14;
import fr.generali.refservcommuns.rce.gestioncontact.gestioncontactservice.GestionContact;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoAdressePostale;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoCourriel;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoDetailAdressePostale;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoInformationCommunication;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoInformationDemarchage;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoPageWeb;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoTelephone;

/**
 * @author selrhazala
 */
@Component("contactProToGestionContactConverter")
public class ContactProToGestionContactConverter implements Converter<IContact, GestionContact> {

    /**
     * Code mail professionnel
     */
    private static final String PROFESSIONNEL = "PRO";

    /**
     * Prefix NPAI
     */
    private static final String PREFIX_MOTIF_NPAI = "n.p.a.i";

    /**
     * {@inheritDoc}
     */
    public GestionContact convert(IContact input) {
        GestionContact gestionContact = null;
        if (input != null) {
            IClientProfessionnel clientPro = IClientProfessionnel.class.cast(input.getClient());
            DtoDossierP14 dtoDossierP14 = new DtoDossierP14();

            // init date du jour
            XMLGregorianCalendar dateDuJour = null;
            try {
                GregorianCalendar gCalendar1 = new GregorianCalendar();
                gCalendar1.setTime(new Date());
                dateDuJour = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar1);
            } catch (DatatypeConfigurationException e) {
                e.getMessage();
            }

            // Si input.getAdresse() != null c'est que l'on souhaite modifier
            // l'adresse
            if (input.getAdresse() != null) {
                IAdresse adresse = input.getAdresse();

                DtoAdressePostale dtoAdressePostale = new DtoAdressePostale();
                dtoAdressePostale.setNomRue(adresse.getVoie());
                dtoAdressePostale.setCodePostal(adresse.getCodePostal());
                dtoAdressePostale.setLocalite(adresse.getVille());
                dtoAdressePostale.setLigne3(adresse.getPointGeographique());
                dtoAdressePostale.setComplementIdentiteDestinataire(adresse.getPointRemise());
                dtoAdressePostale.setLigne5(adresse.getBoitePostale());
                dtoAdressePostale.setPays(adresse.getCodePays());
                dtoAdressePostale.setValide(adresse.isIndicateurNormalisation());
                dtoAdressePostale.setIdentifiant(adresse.getIdentifiant());
                dtoAdressePostale.setIdentiteDestinataire(clientPro.getSphereProfessionnelle().getIdSpherePro());
                dtoAdressePostale.setNumOrdre(adresse.getNumOrdre());
                dtoAdressePostale.setCodeIris(adresse.getCodeIris());
                dtoAdressePostale.setNatureOccupant(adresse.getQualiteOccupation());
                dtoAdressePostale.setTypeBatiment(adresse.getTypeLogement());

                if (StringUtils.isEmpty(adresse.getMotifModifAdresse())) {
                    dtoAdressePostale
                                    .setRaisonModificationAdresse(MotifModificationAdresseEnum.MOTIF_INITIALISATION_ADRESSE
                                                    .getCode());
                } else {
                    dtoAdressePostale.setRaisonModificationAdresse(adresse.getMotifModifAdresse());
                }

                dtoAdressePostale.setDateDerniereMaj(dateDuJour);
                dtoAdressePostale.setDateNormalisationAdresse(dateDuJour);

                DtoDetailAdressePostale detail = new DtoDetailAdressePostale();
                detail.setMotifNpai(adresse.getMotifNpai() == null ? StringUtils.EMPTY : adresse.getMotifNpai());
                detail.setDateNpai(dateDuJour);
                dtoAdressePostale.setInfoNPAI(detail);

                dtoAdressePostale.setCodeTypeModeContact(PROFESSIONNEL);

                List<DtoAdressePostale> listeAdressePostale = new ArrayList<DtoAdressePostale>();
                listeAdressePostale.add(dtoAdressePostale);

                List<DtoListeDossierMajAdresse> listeDossierMajAdr = new ArrayList<DtoListeDossierMajAdresse>();

                DtoListeDossierMajAdresse dtoListeDossierMajAdresse = new DtoListeDossierMajAdresse();
                dtoListeDossierMajAdresse.setIsCourrier(adresse.isCourrier());
                dtoListeDossierMajAdresse.setIsFiscal(adresse.isFiscal());
                dtoListeDossierMajAdresse.setIsPrincipal(adresse.isPrincipal());
                dtoListeDossierMajAdresse.setDtoAdressePostale(dtoAdressePostale);

                DtoMajInformationMarketingImmobilier infoImmo = new DtoMajInformationMarketingImmobilier();
                DtoMajBienImmobilier bienImmo = new DtoMajBienImmobilier();

                if (StringUtils.isNotEmpty(adresse.getNbPieces())) {
                    bienImmo.setNombrePiecesPrincipales(BigInteger.valueOf(Long.parseLong(adresse.getNbPieces())));
                }

                if (StringUtils.isNotEmpty(adresse.getSurface())) {
                    Quantity quantity = new Quantity();
                    quantity.setValue(BigDecimal.valueOf(Long.parseLong(adresse.getSurface())));
                    bienImmo.setSurfaceHabitable(quantity);
                }

                infoImmo.setBiensImmobiliersPossedes(bienImmo);

                if (StringUtils.isNotEmpty(adresse.getFondCommerce())) {
                    DtoMajModeExploitationFondCommerce modeExploit = new DtoMajModeExploitationFondCommerce();
                    modeExploit.setCode(adresse.getFondCommerce());
                    infoImmo.setModeExploitationFondCommerce(modeExploit);
                }

                dtoListeDossierMajAdresse.setDtoMajInformationMarketingImmobilier(infoImmo);

                if (StringUtils.equalsIgnoreCase(adresse.getMotifModifAdresse(),
                                MotifModificationAdresseEnum.MOTIF_DEMENAGEMENT_MODIF_ADRESSE.getCode())) {
                    dtoListeDossierMajAdresse.setSupprimerAncienneAdressePrincipale(Boolean.TRUE);
                } else {
                    dtoListeDossierMajAdresse.setSupprimerAncienneAdressePrincipale(Boolean.FALSE);
                }

                listeDossierMajAdr.add(dtoListeDossierMajAdresse);

                if (dtoDossierP14.getDossierContact() == null) {
                    dtoDossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dtoDossierP14.getDossierContact().getAdresse().addAll(listeDossierMajAdr);
            }

            // Si input.getTelephone() != null c'est que l'on souhaite modifier
            // le telephone
            if (input.getTelephone() != null) {
                ITelephone telephone = input.getTelephone();

                DtoTelephone dtoTelephone = new DtoTelephone();
                dtoTelephone.setNumero(telephone.getNumero());
                dtoTelephone.setTypeTelephone(telephone.getType());
                dtoTelephone.setExtension(telephone.getNumeroPoste());
                dtoTelephone.setPrecisionTelephone(telephone.getPrecision());
                dtoTelephone.setNumOrdre(telephone.getNumOrdre());
                dtoTelephone.setListeRouge(telephone.isListeRouge());

                List<DtoTelephone> listeTelephone = new ArrayList<DtoTelephone>();
                listeTelephone.add(dtoTelephone);

                dtoTelephone.setCodeTypeModeContact(PROFESSIONNEL);

                List<DtoListeDossierMajTelephone> listeDossierMajTel = new ArrayList<DtoListeDossierMajTelephone>();

                DtoListeDossierMajTelephone dtoListeDossierMajTelephone = new DtoListeDossierMajTelephone();
                dtoListeDossierMajTelephone.setIsPrincipal(telephone.isPrincipal());
                dtoListeDossierMajTelephone.setDtoTelephone(dtoTelephone);

                listeDossierMajTel.add(dtoListeDossierMajTelephone);

                if (dtoDossierP14.getDossierContact() == null) {
                    dtoDossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dtoDossierP14.getDossierContact().getTelephone().addAll(listeDossierMajTel);
            }

            // Si input.getMail() != null c'est que l'on souhaite modifier le
            // mail
            if (input.getMail() != null) {
                IEmail mail = input.getMail();

                DtoCourriel dtoCourriel = new DtoCourriel();
                if (mail.isMotifNpai()) {
                    if (mail.getAdresse().startsWith(PREFIX_MOTIF_NPAI)) {
                        dtoCourriel.setAdresseCourriel(mail.getAdresse());
                    } else {
                        dtoCourriel.setAdresseCourriel(PREFIX_MOTIF_NPAI + mail.getAdresse());
                    }
                } else {
                    if (mail.getAdresse().startsWith(PREFIX_MOTIF_NPAI)) {
                        dtoCourriel.setAdresseCourriel(mail.getAdresse().substring(PREFIX_MOTIF_NPAI.length(),
                                        mail.getAdresse().length()));
                    } else {
                        dtoCourriel.setAdresseCourriel(mail.getAdresse());
                    }
                }
                dtoCourriel.setPrecisionCourriel(mail.getPrecision());
                dtoCourriel.setNumOrdre(mail.getNumOrdre());

                List<DtoCourriel> listeCourriel = new ArrayList<DtoCourriel>();
                listeCourriel.add(dtoCourriel);

                dtoCourriel.setCodeTypeModeContact(PROFESSIONNEL);

                List<DtoListeDossierMajCourriel> listeDossierMajCou = new ArrayList<DtoListeDossierMajCourriel>();

                DtoListeDossierMajCourriel dtoListeDossierMajCourriel = new DtoListeDossierMajCourriel();
                dtoListeDossierMajCourriel.setIsPrincipal(mail.isPrincipal());
                dtoListeDossierMajCourriel.setDtoCourriel(dtoCourriel);

                listeDossierMajCou.add(dtoListeDossierMajCourriel);

                if (dtoDossierP14.getDossierContact() == null) {
                    dtoDossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dtoDossierP14.getDossierContact().getCourriel().addAll(listeDossierMajCou);
            }

            // Si getSiteInternet() != null c'est que l'on souhaite modifier le
            // site internet
            if (input.getSiteInternet() != null) {
                ISiteInternet siteInternet = input.getSiteInternet();

                DtoPageWeb dtoPageWeb = new DtoPageWeb();
                dtoPageWeb.setAdresseSiteWeb(siteInternet.getAdresse());
                dtoPageWeb.setNumOrdre(siteInternet.getNumOrdre());

                List<DtoPageWeb> listePageWeb = new ArrayList<DtoPageWeb>();
                listePageWeb.add(dtoPageWeb);

                dtoPageWeb.setCodeTypeModeContact(PROFESSIONNEL);

                List<DtoListeDossierMajPageWeb> listeDossierMajWeb = new ArrayList<DtoListeDossierMajPageWeb>();

                DtoListeDossierMajPageWeb dtoListeDossierMajPageWeb = new DtoListeDossierMajPageWeb();
                dtoListeDossierMajPageWeb.setIsPrincipal(siteInternet.isPrincipal());
                dtoListeDossierMajPageWeb.setDtoPageWeb(dtoPageWeb);

                listeDossierMajWeb.add(dtoListeDossierMajPageWeb);

                if (dtoDossierP14.getDossierContact() == null) {
                    dtoDossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dtoDossierP14.getDossierContact().getPageWeb().addAll(listeDossierMajWeb);
            }

            // Chargement des stopComs
            DtoInformationCommunication dtoInformationCommunication = new DtoInformationCommunication();

            if (clientPro.getCommunication() == null) {
                dtoInformationCommunication.setIndicateurStopCourriel(false);
                dtoInformationCommunication.setIndicateurStopCourrier(false);
                dtoInformationCommunication.setIndicateurStopFax(false);
                dtoInformationCommunication.setIndicateurStopSMS(false);
                dtoInformationCommunication.setIndicateurStopTelephone(false);

                dtoInformationCommunication.setCodeTypeModeContact(PROFESSIONNEL);
            } else {
                dtoInformationCommunication.setIndicateurStopCourriel(!clientPro.getCommunication().isEmailOk());
                dtoInformationCommunication.setIndicateurStopCourrier(!clientPro.getCommunication().isCourrierOk());
                dtoInformationCommunication.setIndicateurStopFax(!clientPro.getCommunication().isTelephoneOk());
                dtoInformationCommunication.setIndicateurStopSMS(!clientPro.getCommunication().isSmsOk());
                dtoInformationCommunication.setIndicateurStopTelephone(!clientPro.getCommunication().isTelephoneOk());

                dtoInformationCommunication.setCodeTypeModeContact(PROFESSIONNEL);
            }

            if (dtoDossierP14.getDossierContact() == null) {
                dtoDossierP14.setDossierContact(new DtoDossierMajDossierContact());
            }

            dtoDossierP14.getDossierContact().getStopCom().add(dtoInformationCommunication);
            dtoDossierP14.getDossierContact().setCodecanalPrefere(clientPro.getCommunication().getCanalDePreference());

            DtoInformationDemarchage dtoInformationDemarchage = new DtoInformationDemarchage();
            dtoInformationDemarchage.setIndicateurAutorisationInformation(clientPro.getCommunication() == null ? false
                            : clientPro.getCommunication().isAutorisation());
            dtoInformationDemarchage.setIndicateurDemarche(clientPro.getCommunication() == null ? false : clientPro
                            .getCommunication().isAutorisation());
            dtoDossierP14.getDossierContact().setDemarchage(dtoInformationDemarchage);

            dtoDossierP14.setCodeUser(StringUtils.EMPTY);
            dtoDossierP14.setIdentifiantPersonne(clientPro.getSphereProfessionnelle().getIdSpherePro());

            DtoListeDossierP14 dtoListeDossierP14 = new DtoListeDossierP14();
            List<DtoDossierP14> listeDtoDossierP14 = new ArrayList<DtoDossierP14>();
            listeDtoDossierP14.add(dtoDossierP14);
            dtoListeDossierP14.getDossierP14().addAll(listeDtoDossierP14);
            gestionContact = new GestionContact();
            gestionContact.setDtoListeDossierP14(dtoListeDossierP14);
        }

        return gestionContact;
    }
}
